/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.upn.sigemfi.sac.beans;

import edu.upn.sigemfi.sac.bc.PersonaDelegate;
import edu.upn.sigemfi.sac.bc.ProductoSbsDelegate;
import edu.upn.sigemfi.sac.bc.SolicitudCreditoDelegate;
import edu.upn.sigemfi.sac.be.AsociacionGarantiaCredito;
import edu.upn.sigemfi.rec.be.Credito;
import edu.upn.sigemfi.rec.be.CuotaCredito;
import edu.upn.sigemfi.sac.bc.SeguroDelegate;
import edu.upn.sigemfi.sac.be.Documento;
import edu.upn.sigemfi.sac.be.DocumentoPresentado;
import edu.upn.sigemfi.sac.be.DocumentoPresentadoPK;
import edu.upn.sigemfi.sac.be.EstadoDocumento;
import edu.upn.sigemfi.sac.be.EstadoSolicitudCredito;
import edu.upn.sigemfi.sac.be.GarantiasSolicitud;
import edu.upn.sigemfi.sac.be.MovimientoSolicitudCredito;
import edu.upn.sigemfi.sac.be.ParametroScoring;
import edu.upn.sigemfi.sac.be.ProductoParametro;
import edu.upn.sigemfi.sac.be.ProductoSbs;
import edu.upn.sigemfi.sac.be.Seguro;
import edu.upn.sigemfi.sac.be.SolicitanteCredito;
import edu.upn.sigemfi.sac.be.SolicitanteCreditoPK;
import edu.upn.sigemfi.sac.be.SolicitudCredito;
import edu.upn.sigemfi.sac.be.SolicitudParametro;
import edu.upn.sigemfi.sac.be.SolicitudParametroPK;
import edu.upn.sigemfi.sac.be.SubProducto;
import edu.upn.sigemfi.seg.be.PersonaJuridica;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import edu.upn.sigemfi.seg.beans.IUController;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author Programador
 */
public class SolicitudCreditoController extends AbstractController {
    private SolicitudCreditoDelegate delegado;
    private ProductoSbsDelegate productoSBSDelegado;
    private PersonaDelegate personaDelegado;
    private SeguroDelegate seguroDelegado;

    private ProductoSbs productoSBS;
    private SubProducto subProducto;

    private SolicitudCredito solicitudCredito;
    private PersonaNatural clienteNatural;
    private PersonaJuridica clienteJuridico;

    private GarantiasSolicitud posibleGarantia;
    private AsociacionGarantiaCredito nuevaGA;

    private MovimientoSolicitudCredito puntoARestaurar;
    private MovimientoSolicitudCredito hojaRuta;

    private Documento doc;
    private DocumentoPresentado docPre;
    private Credito credito;

    private List<EstadoDocumento> estadosDocs;
    //private List<EstadoSolicitudCredito> estados;

    private Seguro seguro;

    private Boolean ga;
    private Boolean gex;
    private Boolean aa;
    private Boolean af;
    private Integer identificador;

    public SolicitudCreditoController() {
        delegado = new SolicitudCreditoDelegate();
        personaDelegado = new PersonaDelegate();
        productoSBSDelegado = new ProductoSbsDelegate();
        seguroDelegado = new SeguroDelegate();

    }

    public Seguro getSeguro() {
        return seguro;
    }

    public void setSeguro(Seguro seguro) {
        this.seguro = seguro;
    }



    public Integer getIdentificador() {
        return identificador;
    }

    public void setIdentificador(Integer identificador) {
        this.identificador = identificador;
    }


    public Boolean getAa() {
        aa = false;
        Long id = solicitudCredito.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito();
        if((id == 4L) || (id == 5L) || (id == 7L)){
            aa = true;
        }
        return aa;
    }

    public Boolean getAf() {
        af = true;
        for(SolicitudParametro par: solicitudCredito.getSolicitudParametroCollection()){
            if(par.getObligatorio()  && (par.getCalificacion() == 0)){
                af = false;
            }
        }
        return af;
    }

    public Boolean getGa() {
        return ga;
    }

    public Boolean getGex() {
        gex = true;
        for(DocumentoPresentado docu: solicitudCredito.getDocumentoPresentadoCollection()){
            if(docu.getFidSacEstadoDocumento().getIdEstadoDocumento() != 2L){
                gex = false;
                return gex;
            }
        }
        return gex;
    }

    public PersonaJuridica getClienteJuridico() {
        return clienteJuridico;
    }

    public void setClienteJuridico(PersonaJuridica clienteJuridico) {
        this.clienteJuridico = clienteJuridico;
    }

    public PersonaNatural getClienteNatural() {
        return clienteNatural;
    }

    public void setClienteNatural(PersonaNatural clienteNatural) {
        this.clienteNatural = clienteNatural;
    }



    public AsociacionGarantiaCredito getNuevaGA() {
        return nuevaGA;
    }

    public void setNuevaGA(AsociacionGarantiaCredito nuevaGA) {
        this.nuevaGA = nuevaGA;
    }

    public GarantiasSolicitud getPosibleGarantia() {
        return posibleGarantia;
    }

    public void setPosibleGarantia(GarantiasSolicitud posibleGarantia) {
        this.posibleGarantia = posibleGarantia;
    }



    public Credito getCredito() {
        return credito;
    }

    public SolicitudCredito getSolicitudCredito() {
        return solicitudCredito;
    }

    public void setSolicitudCredito(SolicitudCredito solicitudCredito) {
        this.solicitudCredito = solicitudCredito;
    }


    public void setCredito(Credito credito) {
        this.credito = credito;
    }

    public Documento getDoc() {
        return doc;
    }

    public void setDoc(Documento doc) {
        this.doc = doc;
    }

    public DocumentoPresentado getDocPre() {
        return docPre;
    }

    public void setDocPre(DocumentoPresentado docPre) {
        this.docPre = docPre;
    }



    public MovimientoSolicitudCredito getPuntoARestaurar() {
        return puntoARestaurar;
    }

    public void setPuntoARestaurar(MovimientoSolicitudCredito puntoARestaurar) {
        this.puntoARestaurar = puntoARestaurar;
    }



    public MovimientoSolicitudCredito getHojaRuta() {
        return hojaRuta;
    }

    public void setHojaRuta(MovimientoSolicitudCredito hojaRuta) {
        this.hojaRuta = hojaRuta;
    }

    public SubProducto getSubProducto() {
        return subProducto;
    }

    public void setSubProducto(SubProducto subProducto) {
        this.subProducto = subProducto;
    }


    public ProductoSbs getProductoSBS() {
        return productoSBS;
    }

    public void setProductoSBS(ProductoSbs productoSBS) {
        this.productoSBS = productoSBS;
    }



    //ADAM

    public String actualizarSeguros(){
        Seguro segu = null;
        Integer porcentaje = 0;
        for(Seguro s: solicitudCredito.getSeguroCollection()){
            if(segu != null){
                if(segu.getIdSeguro() == s.getIdSeguro()){
                    mostrarError("Hay 2 seguros iguales");
                    return "";
                }
            }
            porcentaje = porcentaje + s.getPorcentaje();
            segu = s;
        } 
        
        try {
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        
        return "volver";
    }

    public String asociarSeguro(){
        List<Seguro> seguros = solicitudCredito.getSeguroCollection();
        for(Seguro seg: seguros){
            if(seg.getIdSeguro() == seguro.getIdSeguro()){
                mostrarError("Este seguro ya ha sido agregado");
                return "";
            }
        }     
        List<SolicitudCredito> sols = seguro.getSolicitudCreditoCollection();
        sols.add(solicitudCredito);
        seguro.setSolicitudCreditoCollection(sols);
        seguros.add(seguro);
        solicitudCredito.setSeguroCollection(seguros);
        
        try {
            seguroDelegado.editar(seguro);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "volver";
    }

    public String quitarSeguro(){
        List<Seguro> seguros = solicitudCredito.getSeguroCollection();
        List<SolicitudCredito> sols = seguro.getSolicitudCreditoCollection();
        sols.remove(solicitudCredito);
        seguros.remove(seguro);

        solicitudCredito.setSeguroCollection(seguros);

        try {
            seguroDelegado.editar(seguro);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "";
    }

    public String realizarExtorno(){
        hojaRuta = new MovimientoSolicitudCredito();
        return "realizarExtorno";
    }

    public String extornarSolicitud(){
        hojaRuta = new MovimientoSolicitudCredito();
        return "realizarExtorno";
    }

    public String consultarSolicitudesParaAprobar(){

        solicitudCredito = new SolicitudCredito();
        return "evaluarAutonomia";
    }

    public String irAprobar(){
        return "aprobar";
    }
    public String irHistorial(){
        return "historial";
    }
    public String irEjecutar(){
        return "ejecutar";
    }

    public String evaluarSolicitudAAprobar(){
        hojaRuta = new MovimientoSolicitudCredito();
        return "evaluarAutonomia";
    }

    public List<SolicitudCredito> getSolicitudesAAprobar(){
        List<SolicitudCredito> solicitudes = null;
        try {
            solicitudes = delegado.buscarSolicitudesPorEstado(3L);

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return solicitudes;
    }
    
    public String aprobarAutonomia(){

        try {
            agregarHojaRuta(4L);
            delegado.editar(solicitudCredito);

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "regresar";
    }

    private Boolean validarIdentificador(String identificador, int nro){
        if(!StringUtils.isNumeric(identificador) || (identificador.length() != nro)){
            mostrarError("El DNI debe ser un valor numerico y de 8 digitos");
            return false;
        }
        return true;
    }
    public String desaprobarAutonomia(){
        try {
            agregarHojaRuta(6L);
            solicitudCredito.setMotivoExtorno("Desaprobado");
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }

        return "terminar";
    }


/*
    public SelectItem[] getProductos(){
        SelectItem[] selects = null;
        try {
            productos = productoSBSDelegado.getProductosSBS();
            selects = new SelectItem[productos.size() + 1];
            int i = 0;
            selects[i++] = new SelectItem(null, "Seleccione un Producto");
            for (ProductoSbs p : productos) {
                selects[i++] = new SelectItem(p.getIdProductoSbs(), p.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar los datos");
            System.out.println(e.getMessage());
            mostrarError(e.getMessage());
        }
        return selects;
    }
*/

    //CORRO

    public List<SolicitudCredito> getSolicitudesExtornadas(){
        List<SolicitudCredito> solicitudes = null;
        try {
            solicitudes = delegado.buscarSolicitudesPorEstado(6L);

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return solicitudes;
    }


    public String verRutaCrediticia(){
        return "ver";
    }

    public String irRestaurar(){
        hojaRuta = new MovimientoSolicitudCredito();
        return "restaurar";
    }

    public String restaurarCredito(){

        try {
            if(solicitudCredito.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito() != puntoARestaurar.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito()){
                agregarHojaRuta(puntoARestaurar.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito());

                // Reactivar Solicitantes
                // Reasociar Garantias

                delegado.editar(solicitudCredito);
            }

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }


        return "terminar";
    }

    //YRVING

    public SelectItem[] getSubProductos(){
        SelectItem[] selects = null;
        try {
            if (productoSBS != null) {
                //List<SubProducto> subs =  productoSBSDelegado.getSubProductos(productoSBS.getIdProductoSbs());
                //productoSBS.setSubProductoCollection(subs);
                List<SubProducto> subs = productoSBS.getSubProductoCollection();
                if (productoSBS.getSubProductoCollection() != null) {
                    selects = new SelectItem[subs.size() + 1];
                    int i = 0;
                    selects[i++] = new SelectItem(null, "Seleccione un SubTipo de Credito");
                    for (SubProducto sb : productoSBS.getSubProductoCollection()) {
                        selects[i++] = new SelectItem(sb, sb.getNombre());
                    }
                } else {
                    selects = new SelectItem[1];
                    selects[0] = new SelectItem(null, "El Tipo de Credito no tiene Subtipos registrados");
                }
            } else {
                selects = new SelectItem[1];
                selects[0] = new SelectItem(null, "Seleccione un Subtipo de Credito");
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar los datos");
            mostrarError(e.getMessage());
        }
        return selects;

    }

    public Boolean verificarDatosSC(){
        Boolean band = true;
        
        if(productoSBS==null){
            mostrarError("Escoja un tipo de Credito");
            band = false;
        }
        
        if(solicitudCredito == null){
            mostrarError("No se ha iniciado la Solicitud de Credito");
            band = false;
        }
        else{
            if(solicitudCredito.getFidSacSubProducto()==null){
                mostrarError("Escoja un subtipo de Credito");
                band = false;
            }
            else{
                if(solicitudCredito.getMonto() == null){
                    mostrarError("Es necesario definir el monto para el credito");
                    band = false;
                }
                else{
                    if((solicitudCredito.getMonto() < solicitudCredito.getFidSacSubProducto().getMontoMinimo()) || (solicitudCredito.getMonto() > solicitudCredito.getFidSacSubProducto().getMontoMaximo())){
                        mostrarError("El monto solicitado esta fuera del rango permitido");
                        band = false;
                    }
                }
                
                if(solicitudCredito.getNroCuotas() == null){
                    mostrarError("Es necesario definir el numero de cuotas");
                    band = false;
                }
                else{
                    if((solicitudCredito.getNroCuotas() < solicitudCredito.getFidSacSubProducto().getNroCuotasMin()) || (solicitudCredito.getNroCuotas() > solicitudCredito.getFidSacSubProducto().getNroCuotasMax())){
                        mostrarError("El numero de cuotas esta fuera del rango permitido");
                        band = false;
                    }
                }
            }
        }

        return band;
    }

    public String registrar(){

        if(!verificarDatosSC()){
            return "";
        }

        IUController iu = null;

        iu = (IUController) getBean("iu");


        try{
            List<DocumentoPresentado> docs = new ArrayList<DocumentoPresentado>();
            List<Documento> docus = solicitudCredito.getFidSacSubProducto().getDocumentoCollection();
            Short Obli = 1;
            
            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(1L));
            solicitudCredito.setFechaRegistro(new Date());

            delegado.crear(solicitudCredito);

            for(Documento d : docus){
                DocumentoPresentado dp = new DocumentoPresentado();
                DocumentoPresentadoPK dpPk = new DocumentoPresentadoPK();
                dpPk.setFidSacDocumento(d.getIdDocumento());
                dpPk.setFidSacSolicitudCredito(solicitudCredito.getIdSolicitudcredito());
                dp.setDocumentoPresentadoPK(dpPk);
                dp.setDocumento(d);

                dp.setFidSacEstadoDocumento(delegado.buscarEstadoDocumento(1L));
                dp.setObligatorio(Obli);
                dp.setSolicitudCredito(solicitudCredito);

                docs.add(dp);
            }

            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(2L));
            solicitudCredito.setDocumentoPresentadoCollection(docs);

            ArrayList<SolicitudParametro> solPars = new ArrayList<SolicitudParametro>();
            for(ProductoParametro par: solicitudCredito.getFidSacSubProducto().getFidSacProductoSbs().getProductoParametroCollection()){
                SolicitudParametro solPar = new SolicitudParametro();
                SolicitudParametroPK solParPK = new SolicitudParametroPK(solicitudCredito.getIdSolicitudcredito(), par.getParametroScoring().getIdParametroScoring());

                solPar.setSolicitudParametroPK(solParPK);
                solPar.setParametroScoring(par.getParametroScoring());
                solPar.setSolicitudCredito(solicitudCredito);
                solPar.setObligatorio(par.getObligatorio());
                solPar.setPeso(par.getPeso());
                solPar.setCalificacion(0);
                
                List <SolicitudParametro> params = par.getParametroScoring().getSolicitudParametroCollection();
                params.add(solPar);
                par.getParametroScoring().setSolicitudParametroCollection(params);
                
                delegado.crearParametro(solPar);

                solPars.add(solPar);
            }

            solicitudCredito.setSolicitudParametroCollection(solPars);
            agregarHojaRuta(2L);
            
            solicitudCredito.setFidSegEmpleado(iu.getUsuarioLogueado().getEmpleado());

            if((clienteNatural.getIdPersona() != null) || (clienteJuridico.getIdPersona() != null)){
                SolicitanteCredito sol = new SolicitanteCredito();
                SolicitanteCreditoPK pk = new SolicitanteCreditoPK();

                sol.setEstado(Obli);

                if(identificador == 1){
                    sol.setPersona(clienteNatural);
                    pk.setFidSegPersona(clienteNatural.getIdPersona());
                }
                else if(identificador == 2){
                    sol.setPersona(clienteJuridico);
                    pk.setFidSegPersona(clienteJuridico.getIdPersona());
                }

                pk.setFidSacSolicitudCredito(solicitudCredito.getIdSolicitudcredito());
                sol.setSolicitanteCreditoPK(pk);
                solicitudCredito.setSolicitanteCreditoCollection(new ArrayList<SolicitanteCredito>());
                solicitudCredito.getSolicitanteCreditoCollection().add(sol);
            }

            delegado.editar(solicitudCredito);
        }catch(Exception e){
                e.printStackTrace();
                mostrarError(e.getMessage());
                return "";
        }
        return "nuevaSolicitud";
    }

    public String solicitudPendiente(){
        solicitudCredito = null;
        clienteJuridico = new PersonaJuridica();
        clienteNatural = new PersonaNatural();
        return "irBuscar";
    }

    public String buscarSolicitud(){

        try {

            if(identificador == 1){
                if(!validarIdentificador(clienteNatural.getDniPersona(),8)){
                    return "";
                }
                PersonaNatural clie = null;
                //JOptionPane.showMessageDialog(null, clienteNatural.getDniPersona());
                clie = personaDelegado.buscarPersonaPorDNI(clienteNatural.getDniPersona());

                if(clie!=null){
                    clienteNatural = clie;
                }
            }
            else if(identificador == 2){
                if(!validarIdentificador(clienteJuridico.getRuc() ,11)){
                    return "";
                }
            }



            // BUSCAR Solicitud de Credito del cliente

            solicitudCredito = delegado.buscar(1L);
            
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "";
    }

    public String tramitar(){
        return "editar";
    }
    
    
    public String getStringInteres(){
        
        Double interes = solicitudCredito.getFidSacSubProducto().getTasaInteresVencido()*100;
        return interes.toString() + "%";
    }

    

    private void agregarHojaRuta(Long est){

        try {
            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(est));
         } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
         }

        if(solicitudCredito.getMovimientoSolicitudCreditoCollection() == null){
            solicitudCredito.setMovimientoSolicitudCreditoCollection(new ArrayList<MovimientoSolicitudCredito>());
        }
        hojaRuta.setFidSacEstadoSolicitudCredito(solicitudCredito.getFidSacEstadoSolicitudCredito());
        hojaRuta.setFidSacSolicitudCredito(solicitudCredito);
        hojaRuta.setFecha(new Date());
        solicitudCredito.getMovimientoSolicitudCreditoCollection().add(hojaRuta);
    }

    public String agregaPosibleGarantia(){
        posibleGarantia = new GarantiasSolicitud();
        return "posibleGarantia";
    }

    public String verGarantias(){
        return "verGarantias";
    }

    public String agregaGarantia(){
        return "seleccionar";
    }

    public String buscarGarantias(){
        return "buscarGarantia";
    }
    
    public String agregarGarantia(){
        return "irPrincipal";
    }


    public String agregarPosibleGarantia(){
        posibleGarantia.setFidSacSolicitudCredito(solicitudCredito);
        solicitudCredito.getGarantiasSolicitudCollection().add(posibleGarantia);
        return "volver";
    }

    public String removerPosibleGarantia(){
        solicitudCredito.getGarantiasSolicitudCollection().remove(posibleGarantia);
        return "";
    }

    public String actualizarGarantias(){
        try {
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "volver";
    }

    private void extornarCredito(){
        //Liberar Garancias
        //Desactivar Solicitantes

    }

    public SelectItem[] getEstadosDocumentos() {

        SelectItem[] selects = null;
        try {
            estadosDocs = delegado.getEstadosDocumentos();
            selects = new SelectItem[estadosDocs.size()];
            int i = 0;
            for (EstadoDocumento es : estadosDocs) {
                selects[i++] = new SelectItem(es, es.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar estados de documentos");
            System.out.println(e.getMessage());
            mostrarError(e.getMessage());
        }
        return selects;
    }

    public String enviarAAprobacion(){



        try {
            hojaRuta = new MovimientoSolicitudCredito();
            agregarHojaRuta(3L);
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "";
    }

    public String nuevo(){
        solicitudCredito = new SolicitudCredito();
        clienteJuridico = new PersonaJuridica();
        clienteNatural = new PersonaNatural();
        hojaRuta = new MovimientoSolicitudCredito();
        identificador = 1;
        return "nuevo";
    }

    public String buscarCliente(){
        if(identificador == 1){
            if(!validarIdentificador(clienteNatural.getDniPersona(),8)){
               return "";
            }
            PersonaNatural clie = null;
            try {
                //JOptionPane.showMessageDialog(null, clienteNatural.getDniPersona());
                clie = personaDelegado.buscarPersonaPorDNI(clienteNatural.getDniPersona());

            } catch (Exception ex) {
                Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
                mostrarError(ex.getMessage());
            }
            if(clie!=null){
                clienteNatural = clie;
            }
        }
        else if(identificador == 2){
            if(!validarIdentificador(clienteJuridico.getRuc() ,11)){
                return "";
            }
        }
        return "";
    }
    
    //SUSAN

    public List<SolicitudCredito> getSolicitudesParaEjecutar(){
        List<SolicitudCredito> solicitudes = null;
        try {
            solicitudes = delegado.buscarSolicitudesPorEstado(4L);

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return solicitudes;
    }

    public String verExpediente(){

        return "verExpediente";
    }


    public String agregarDocAdicional(){

        doc = new Documento();
        docPre = new DocumentoPresentado();
        return "docAdicional";
    }

    public String regDocAdicional(){
        try {
            productoSBSDelegado.crearDocumento(doc);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }

        Short Obli = 0;
        DocumentoPresentadoPK dpPk = new DocumentoPresentadoPK();
        docPre.setDocumento(doc);
        docPre.setSolicitudCredito(solicitudCredito);
        
        dpPk.setFidSacDocumento(doc.getIdDocumento());
        dpPk.setFidSacSolicitudCredito(solicitudCredito.getIdSolicitudcredito());
        docPre.setDocumentoPresentadoPK(dpPk);

        docPre.setObligatorio(Obli);
        solicitudCredito.getDocumentoPresentadoCollection().add(docPre);

        return "volver";
    }


    public String actualizarExpediente(){
        try {

            for(DocumentoPresentado dpre: solicitudCredito.getDocumentoPresentadoCollection()){
                if(dpre.getFechaPresentacion()==null){
                    dpre.setFechaPresentacion(new Date());
                }
            }
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "volver";
    }

    public String ejecutarCredito() {
        hojaRuta = new MovimientoSolicitudCredito();
        return "ejecutarCredito";
    }

    

    public String verCuotas(){

        Credito cred = new Credito();

        for(DocumentoPresentado dpre: solicitudCredito.getDocumentoPresentadoCollection()){
            if(dpre.getFechaPresentacion()==null){
                dpre.setFechaPresentacion(new Date());
            }
        }

        cred.setFechaRegistro(new Date());
        double calculo = this.solicitudCredito.getMonto() + this.solicitudCredito.getMonto()*solicitudCredito.getFidSacSubProducto().getTasaInteresVencido();
        cred.setMontoTotal(calculo);
        cred.setFechaInicio(new Date());
        cred.setEstado(true);
        solicitudCredito.setFidRecCredito(cred);
//        cred.setSolicitudCreditoCollection(new ArrayList<SolicitudCredito>());
//        cred.getSolicitudCreditoCollection().add(this.solicitudCredito);
//        try {
//
//
//            delegado.crearCredito(cred, solicitudCredito);
//
//
//        } catch (Exception e) {
//            mostrarError("Error en SolicitudDelegate.ejecutarCredito. " + e.getMessage());
//        }
//        credito = cred;
//        solicitudCredito.setFidSacCredito(credito);

        try {
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError("Primer Actualizar" + ex.getMessage());
        }

        Calendar cal = Calendar.getInstance();
        solicitudCredito.getFidRecCredito().setCuotaCreditoCollection(new ArrayList<CuotaCredito>());

        for (int i = 0; i < solicitudCredito.getNroCuotas(); i++) {
            CuotaCredito cuota = new CuotaCredito();
            cuota.setNroCuota(i + 1);
            cuota.setFidRecCredito(solicitudCredito.getFidRecCredito());
            double coninteres = (solicitudCredito.getMonto() / solicitudCredito.getNroCuotas()) * solicitudCredito.getFidSacSubProducto().getTasaInteresVencido();
            cuota.setMonto((solicitudCredito.getMonto() / solicitudCredito.getNroCuotas()) + coninteres);
            cal.setTime(new Date());
            cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + i);
            cuota.setFechaVencimiento(cal.getTime());
            solicitudCredito.getFidRecCredito().getCuotaCreditoCollection().add(cuota);
        }

        agregarHojaRuta(5L);

        try {
            delegado.actulizarCredito(solicitudCredito.getFidRecCredito());
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError("Segundo Actualizar" + ex.getMessage());
        }


            
        return "verCuotas";
    }

    public String calcularScoring(){
        Integer sumPromedios = 0;
        Integer sumPesos = 0;
        for(SolicitudParametro par: solicitudCredito.getSolicitudParametroCollection()){
            if(par.getCalificacion() != 0){
                sumPromedios = sumPromedios + par.getPeso()*par.getCalificacion();
                sumPesos = sumPesos + par.getPeso();
            }
            
            try {
                delegado.editarParametro(par);
            } catch (Exception ex) {
                Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
                mostrarError(ex.getMessage());
                return"";
            }

        }

        solicitudCredito.setScoring(sumPromedios.doubleValue()/sumPesos.doubleValue());

        try {
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
            return "";
        }
        return "";
    }


}
